'''
Author: @zhyy
Date: 2021-01-27 14:23:32
LastEditors: @zhyy
LastEditTime: 2021-01-31 16:04:10
'''
from . import api
from app import db, constants
from app.models import Order
from flask import current_app, jsonify, g, request
from response_code import RET
from alipay import AliPay
import os


@api.route("/orders/<int:order_id>/pay", methods=["POST"])
def order_pay(order_id):
    req_data=request.get_json()
    order_id=req_data.get("order_id")
    """订单支付"""
    # 检验订单
    try:
        order = Order.query.filter(Order.id == order_id, Order.status == "未支付").first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库异常")

    if not order:
        return jsonify(errno=RET.ROLEERR, errmsg="操作失败")

    # 业务逻辑处理：调用支付宝接口

    # 创建支付宝sdk的工具对象
    # 私钥                                      当前目录(__file__ 代表当前目录路径)
    app_private_key_path = open(os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem")).read()  # 私钥
    alipay_public_key_path = open(os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem")).read()  # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,

    alipay = AliPay(
        appid=constants.ALIPAY_APP_ID,
        app_notify_url=None, # 默认回调url
        app_private_key_string=app_private_key_path, # 私钥
        # 支付宝公钥，验证支付宝回传消息使用，不是你自己的公钥
        alipay_public_key_string=alipay_public_key_path,

        sign_type="RSA2",  # RSA 或者 RSA2
        debug=True  # 默认false, true是沙箱环境
    )

    # 手机网站支付，需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string
    order_string = alipay.api_alipay_trade_wap_pay(
        out_trade_no=order_id,  # 订单编号
        total_amount=order.amount/100.0,  # 支付金额
        subject="爱租房 %s " % order_id,  # 订单标题
        return_url="http://127.0.0.1:5000/orders.html",  # 返回链接地址
        notify_url=None  # 可选, 不填则使用默认notify url
    )

    pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string

    return jsonify(errno=RET.OK, errmsg="OK", data={"pay_url":pay_url})


@api.route("/order/payment", methods=["PUT"])
@login
def save_order_payment():
    """保存订单支付结果"""
    alipay_dict = request.form.to_dict()

    # 对支付宝的数据进行分离  提取出支付宝的签名参数sign 和剩下的其他数据
    alipay_sign = alipay_dict.pop("sign")

    # 创建支付宝sdk的工具对象
    # 私钥                                      当前目录(__file__ 代表当前目录路径)
    app_private_key_path = open(os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem")).read()  # 私钥
    alipay_public_key_path = open(
        os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem")).read()  # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,

    alipay = AliPay(
        appid=constants.ALIPAY_APP_ID,
        app_notify_url=None,  # 默认回调url
        app_private_key_string=app_private_key_path,  # 私钥
        # 支付宝公钥，验证支付宝回传消息使用，不是你自己的公钥
        alipay_public_key_string=alipay_public_key_path,
        sign_type="RSA2",  # RSA 或者 RSA2
        debug=True  # 默认false, true是沙箱环境
    )

    # 验证参数是否是支付宝传的，是，则返回True
    # verify 根据支付宝传来的参数，使用RSA2 加密，与支付宝传来的sign 是否一致
    result = alipay.verify(alipay_dict, alipay_sign)

    if result:
        # 修改订单信息
        order_id = alipay_dict.get("out_trade_no")
        trade_no = alipay_dict.get("trade_no")
        try:
            Order.query.filter_by(id=order_id).update({"status":"WAIT_COMMENT", "trade_no":trade_no})
            db.session.commit()
        except Exception as e:
            db.session.rollback()
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg="数据库异常")

    return jsonify(errno=RET.OK, errmsg="OK")
